{
try
{
+ INT64 checked_size = x3f_thumb_size(); // This value was checked at upper level?
x3f_t *x3f = (x3f_t *)_x3f_data;
if (!x3f)
return; // No data pointer set
imgdata.thumbnail.tcolors = 3;
if (imgdata.thumbnail.tformat == LIBRAW_THUMBNAIL_JPEG)
{
- imgdata.thumbnail.thumb = (char *)malloc(ID->data_size);
+ INT64 alloc_size = ID->data_size;
+ if ((alloc_size > 2 * checked_size) || (alloc_size > 1024LL * 1024LL * LIBRAW_MAX_THUMBNAIL_MB))
+ throw LIBRAW_EXCEPTION_TOOBIG;
+ if(alloc_size < 64LL)
+ throw LIBRAW_EXCEPTION_IO_CORRUPT;
+
+ imgdata.thumbnail.thumb = (char *)malloc(ID->data_size);
memmove(imgdata.thumbnail.thumb, ID->data, ID->data_size);
imgdata.thumbnail.tlength = ID->data_size;
}
else if (imgdata.thumbnail.tformat == LIBRAW_THUMBNAIL_BITMAP)
{
+ INT64 alloc_size = INT64(ID->columns) * INT64(ID->rows) * 3LL;
+ if ((alloc_size > 2 * checked_size) ||
+ (alloc_size > 1024LL * 1024LL * LIBRAW_MAX_THUMBNAIL_MB)) throw LIBRAW_EXCEPTION_TOOBIG;
+ if (alloc_size < 64LL)
+ throw LIBRAW_EXCEPTION_IO_CORRUPT;
+
imgdata.thumbnail.tlength = ID->columns * ID->rows * 3;
imgdata.thumbnail.thumb = (char *)malloc(ID->columns * ID->rows * 3);
char *src0 = (char *)ID->data;
}
catch (...)
{
- // do nothing
+ // no rethrow: handled at upper level
+ imgdata.thumbnail.twidth = 0;
+ imgdata.thumbnail.theight = 0;
+ imgdata.thumbnail.tcolors = 0;
}
}
if (fpos + size > I->input.file->size())
throw LIBRAW_EXCEPTION_IO_CORRUPT;
+ // All known files from real cameras are many times smaller than 1 GB, so the hard limit is OK here.
+
+ if(size > 1024*1024*1024)
+ throw LIBRAW_EXCEPTION_ALLOC;
+
*data = (void *)malloc(size);
+ if (!*data)
+ throw LIBRAW_EXCEPTION_ALLOC;
GETN(*data, size);